﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorSQL.BLL;
using GestorSQL.BusinessEntities;
using GestorSQL.Utility;
using GestorSQL.BLL.ImplementationsBridge;

namespace GestorSQL.GUI
{
    public partial class AddConnection : Form
    {
        #region Variables Privadas
        private ConnectionManager _connectionManager = new ConnectionManager();
        private StringBuilder sbCadenaConexionPreview = new StringBuilder();
        private int IdConexion;

        #endregion

        #region Construtores
        public AddConnection()
        {
            InitializeComponent();
            IdConexion = 0;

            cbAmbientes.DataSource = new List<Ambiente>{
            Ambiente.Desarrollo, Ambiente.Produccion, Ambiente.Pruebas
            };

            cbCore.DataSource = _connectionManager.GetCoreList();
        }

        public AddConnection(Conexion conexion)
        {
            InitializeComponent();

            cbAmbientes.DataSource = new List<Ambiente>{
            Ambiente.Desarrollo, Ambiente.Produccion, Ambiente.Pruebas
            };

            cbAmbientes.SelectedItem = conexion.Ambiente;
            tbBaseDeDatos.Text = conexion.BaseDeDatos;
            tbContraseña.Text = conexion.Contrasena.Decrypt();
            tbNombreConexion.Text = conexion.Nombre;
            rTextPropiedades.Text = conexion.Propiedades;
            tbServidor.Text = conexion.Servidor;
            tbUsuario.Text = conexion.Usuario.Decrypt();

            IdConexion = conexion.IdConexion;

            ActualizarCadenaDeConexion();
        }

        #endregion

        #region Handlers
        private void btnAceptar_Click(object sender, EventArgs e)
        {

            if (TestSQLServerConnection(rTextPreview.Text.Trim()))
            {
                _connectionManager.SaveConnection(new Conexion()
                {
                    Ambiente_ = (Ambiente)cbAmbientes.SelectedItem,
                    Fk_Core = (int)cbCore.SelectedValue,
                    BaseDeDatos = tbBaseDeDatos.Text,
                    Contrasena = tbContraseña.Text.Encrypt(),
                    Nombre = tbNombreConexion.Text,
                    Propiedades = rTextPropiedades.Text,
                    Servidor = tbServidor.Text,
                    Usuario = tbUsuario.Text.Encrypt(),
                    IdConexion = this.IdConexion

                });
            }

            this.Close();
            this.DialogResult = DialogResult.OK;
        }

        private void cbServidores_SelectedIndexChanged(object sender, EventArgs e)
        {


        }

        private void tbServidor_TextChanged(object sender, EventArgs e)
        {
            ActualizarCadenaDeConexion();
        }

        private void tbBaseDeDatos_TextChanged(object sender, EventArgs e)
        {
            ActualizarCadenaDeConexion();
        }

        private void tbUsuario_TextChanged(object sender, EventArgs e)
        {
            ActualizarCadenaDeConexion();
        }

        private void tbContraseña_TextChanged(object sender, EventArgs e)
        {
            ActualizarCadenaDeConexion();
        }

        private void rTextPropiedades_TextChanged(object sender, EventArgs e)
        {
            ActualizarCadenaDeConexion();

        }

        private void lblServidor_Click(object sender, EventArgs e)
        {

        }

        private void btnTestConnection_Click(object sender, EventArgs e)
        {

            TestSQLServerConnection(rTextPreview.Text.Trim());

        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
            this.DialogResult = DialogResult.Cancel;

        }

        private void cbCore_SelectedIndexChanged(object sender, EventArgs e)
        {
            ActualizarCadenaDeConexion();
        }
        
        #endregion

        #region Metodos Privados
        private void ActualizarCadenaDeConexion()
        {
            rTextPreview.Text = "";
            rTextPreview.Text = _connectionManager.GetConnectionStringByConnection(new Conexion()
            {
                Ambiente_ = (Ambiente)cbAmbientes.SelectedItem,
                Fk_Core = (int)cbCore.SelectedValue,
                BaseDeDatos = tbBaseDeDatos.Text,
                Contrasena = tbContraseña.Text.Encrypt(),
                Nombre = tbNombreConexion.Text,
                Propiedades = rTextPropiedades.Text,
                Servidor = tbServidor.Text,
                Usuario = tbUsuario.Text.Encrypt(),
                IdConexion = this.IdConexion
            });
        }

        private bool TestSQLServerConnection(string connectionString)
        {

            bool test = _connectionManager.TestConnection(
                new Conexion()
                {
                    Ambiente_ = (Ambiente)cbAmbientes.SelectedItem,
                    Fk_Core = (int)cbCore.SelectedValue,
                    BaseDeDatos = tbBaseDeDatos.Text,
                    Contrasena = tbContraseña.Text.Encrypt(),
                    Nombre = tbNombreConexion.Text,
                    Propiedades = rTextPropiedades.Text,
                    Servidor = tbServidor.Text,
                    Usuario = tbUsuario.Text.Encrypt(),
                    IdConexion = this.IdConexion
                });


            if (test)
                MessageBox.Show(Properties.Resources.Connection_ConnectionSuccess);
            else
                MessageBox.Show((Properties.Resources.Connection_ConnectionFailed));
            return test;
        }
        #endregion

    }
}
